//
// Created by ROG on 2024/11/20.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define MAX_LEN 100 // 定义串的最大长度

typedef struct {
    char data[MAX_LEN]; // 用于存储字符串内容
    int length;         // 串的实际长度
} String;

// 初始化串
void InitString(String *str) {
    str->length = 0;
    str->data[0] = '\0';
}

// 赋值操作
void AssignString(String *str, const char *content) {
    int len = strlen(content);
    if (len >= MAX_LEN) {
        printf("字符串过长，赋值失败！\n");
        return;
    }
    strcpy(str->data, content);
    str->length = len;
}

// 求串的长度
int StringLength(const String *str) {
    return str->length;
}

// 复制操作
void CopyString(String *dest, const String *src) {
    strcpy(dest->data, src->data);
    dest->length = src->length;
}

// 判断两个串是否相等
bool StringEquals(const String *str1, const String *str2) {
    return strcmp(str1->data, str2->data) == 0;
}

// 连接两个串
void ConcatString(String *result, const String *str1, const String *str2) {
    if (str1->length + str2->length >= MAX_LEN) {
        printf("连接后的字符串过长，操作失败！\n");
        return;
    }
    strcpy(result->data, str1->data);
    strcat(result->data, str2->data);
    result->length = str1->length + str2->length;
}

// 比较两个串的大小
int CompareString(const String *str1, const String *str2) {
    return strcmp(str1->data, str2->data);
}

// 插入子串
bool InsertString(String *str, int pos, const char *sub) {
    int subLen = strlen(sub);
    if (pos < 0 || pos > str->length || str->length + subLen >= MAX_LEN) {
        printf("插入操作失败！\n");
        return false;
    }
    // 移动原字符串后半部分
    for (int i = str->length - 1; i >= pos; i--) {
        str->data[i + subLen] = str->data[i];
    }
    // 插入新字符串
    for (int i = 0; i < subLen; i++) {
        str->data[pos + i] = sub[i];
    }
    str->length += subLen;
    str->data[str->length] = '\0';
    return true;
}

// 删除子串
bool DeleteString(String *str, int pos, int len) {
    if (pos < 0 || pos >= str->length || len < 0 || pos + len > str->length) {
        printf("删除操作失败！\n");
        return false;
    }
    for (int i = pos + len; i < str->length; i++) {
        str->data[i - len] = str->data[i];
    }
    str->length -= len;
    str->data[str->length] = '\0';
    return true;
}

// 输出串
void PrintString(const String *str) {
    printf("%s\n", str->data);
}

// 测试函数
int main() {
    String str1, str2, result;
    InitString(&str1);
    InitString(&str2);
    InitString(&result);

    AssignString(&str1, "Hello");
    AssignString(&str2, "World");

    printf("str1: ");
    PrintString(&str1);
    printf("str2: ");
    PrintString(&str2);

    printf("长度：str1=%d, str2=%d\n", StringLength(&str1), StringLength(&str2));

    if (StringEquals(&str1, &str2)) {
        printf("str1 & str2 are equal\n");
    } else {
        printf("str1 & str2 are not equal \n");
    }

    ConcatString(&result, &str1, &str2);
    printf("连接后的字符串: ");
    PrintString(&result);

    printf("比较 str1 和 str2 的大小: %d\n", CompareString(&str1, &str2));

    InsertString(&str1, 5, " Everyone");
    printf("插入后的 str1: ");
    PrintString(&str1);

    DeleteString(&str1, 5, 9);
    printf("删除后的 str1: ");
    PrintString(&str1);

    return 0;
}
